/*
*   N Ml Md
    A B D A,B之间的距离小于等于D Ml行
    A B D A,B之间的距离大于等于D Md行
    1,N之间的距离

    双向图
    开始时按编号顺序站队，可以重叠站位 s[i]<=s[i+1]
    处理小于等于 a b l s[b]-s[a]<=l->s[b]<=s[a]+l
    处理大于等于 a b d s[b]-s[a]>=d->s[b]>=s[a]+d

    超级源点
*/

#include<iostream>
#include<cstring>
#include<queue>
#define DEBUG
using namespace std;
const int N=1010, M=100010, INF=0x3f3f3f3f;

int n, m, ml, md;
int e[M], ne[M], h[N], w[M], idx;
bool st[N]; // 是否从当前点找到最短路径
int dist[N], cnt[N]; //cnt[]:松弛次数/访问次数，如果i被访问n次，且仍在被更新，说明为负环

void AddEdge(int a, int b, int c)
{
    e[idx]=b, ne[idx]=h[a], w[idx]=c, h[a]=idx++;
}

// spfa 从边出发 适合稀疏图
bool spfa(int cntstart) //有多少个起点 n判断负环 1求最短距离
{
    memset(st, 0, sizeof st);
    memset(cnt, 0, sizeof cnt);
    memset(dist, 0x3f, sizeof dist);

    queue<int> q; 
    for(int i=1; i<=cntstart; i++) q.push(i), st[i]=true, dist[i]=0; //每个节点之间距离为0

    while(q.size())
    {
        auto u=q.front();q.pop();
        st[u]=false;

        for(int i=h[u]; ~i; i=ne[i])
        {
            int v=e[i];
            if(dist[v]>dist[u]+w[i]){ // 这个权值更新终点，对整体结果有影响
                dist[v]=dist[u]+w[i];
                cnt[v]=cnt[u]+1;
                if(cnt[v]>=n) return true; //存在负环
                if(!st[v]) //不在队内，不存在更新可能
                {
                    st[v]=true; //放入队列
                    q.push(v);
                }
            }
        }
    }
    return false;
}

signed main()
{
    #ifdef DEBUG
        freopen("./in.txt","r",stdin);
        freopen("./out.txt","w",stdout);
    #else
    ios::sync_with_stdio(false);   
	cin.tie(0); cout.tie(0);
    #endif
    
    memset(h, -1, sizeof h);
    cin>>n>>ml>>md;
    
    for(int i=1; i<n; i++) {
        AddEdge(i+1, i, 0);
    }

    for(int i=0; i<ml; i++) {
        int a, b, c; cin>>a>>b>>c;
        if(a>b) swap(a, b); // a<=b
        AddEdge(a, b, c);
    }

    for(int i=0; i<md; i++) {
        int a, b, c; cin>>a>>b>>c;
        if(a>b) swap(a, b); // a<=b
        AddEdge(b, a, -c);
    }

    if(spfa(n))
        puts("-1");
    else
    {
        spfa(1);
        if(dist[n]==INF) puts("-2");
        else cout << dist[n] << endl;
    }
    return 0;
}
